package com.job.utils;

import com.job.jpa.JavaJpa;
import com.job.pojo.Java;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@NoArgsConstructor
@Component
public class MyUtils {
    //图片保存后缀
    private static String suffix;
    //图片名称，从1开始
    private static long name;
    @Value("${pic.suffix:.jpg}")
    public void setSuffix(String suffix) {
        MyUtils.suffix = suffix;
    }
    @Value("${pic.name:#{1}}")
    public void setName(long name) {
        MyUtils.name = name;
    }
    //操作数据库对象
    public static JavaJpa javaJpa;
    @Autowired
    public void setJavaJpa(JavaJpa javaJpa){
        MyUtils.javaJpa=javaJpa;
    }
    public MyUtils(int num, int sizeByPerPage) {
        this.num=num;
        this.sizeByPerPage=sizeByPerPage;
    }
    //当前页数，第0页开始
    private int num;
    //每页显示的条数
    private int sizeByPerPage;
    //记录上一次的操作
    private String recordPage=null;
    //记录上一次的结果
    private List<Java> List=new ArrayList<>();
    //记录是否删除的标志
    private boolean isDel=false;
    public void setDel(boolean del) {
        isDel = del;
    }
    //时间格式
    private final static SimpleDateFormat format=new SimpleDateFormat();
    static {
        format.applyPattern("yyyy年M月d日H:m");
    }
    /**
     * 功能：根据url和更新时间判断数据库是否有和是否更新
     * @param java 获取到的pojo对象
     */
    @Transactional
    public void caoZuo(Java java){
        Java par=new Java();
        String pushTime=java.getPushTime();
        String url=java.getOrigin();
        par.setOrigin(url);
        par.setPushTime(pushTime);
        if (javaJpa.findByOriginAndPushTime(url,pushTime)==null){//没找到，就存或者更新
            javaJpa.saveAndFlush(java);
        }
    }
    /**
     * 功能：清空数据库
     */
    public void delData() {
        javaJpa.deleteAll();
    }

    /**
     * 功能：得到数据库中的条数
     * @return 返回条数
     */
    public long getNums(){
        return javaJpa.count();
    }
    /**
     * 功能：表格翻页
     * @param page 当前执行的操作
     * @return 返回该页查找到的条数
     */
    public List<Java> getPage(String page){
        PageRequest pageRequest;
        long size;
        switch (page){
            case "start":
                pageRequest=PageRequest.of(0,sizeByPerPage);
                num=0;
                break;
            case "up"://下一页
                size=getTotalSize();
                if (num+1>(size%sizeByPerPage==0?size/sizeByPerPage-1:size/sizeByPerPage)){
                    pageRequest=PageRequest.of(num,sizeByPerPage);
                }else {
                    pageRequest=PageRequest.of(num+1,sizeByPerPage);
                    num=num+1;
                }
                break;
            case "down"://上一页
                if (Math.max(num - 1, 0)==0){
                    pageRequest=PageRequest.of(0,sizeByPerPage);
                    num=0;
                }else {
                    pageRequest=PageRequest.of(num-1,sizeByPerPage);
                    num-=num;
                }
                break;
            case "end":
                size=getTotalSize();
                if (size%sizeByPerPage==0){
                    num=(int)Math.max(size/sizeByPerPage-1,0);
                    pageRequest=PageRequest.of(num,sizeByPerPage);
                }else {
                    pageRequest=PageRequest.of((int)size/sizeByPerPage,sizeByPerPage);
                    num=(int)size/sizeByPerPage;
                }
                break;
            default:return null;
        }
        return javaJpa.findAll(pageRequest).getContent();
    }
    /**
     * 功能：得到总页数
     * @return 返回数据库中的总页数
     */
    private long getTotalPage(){
        long tempNUm;
        //余数为0说明除尽,
        tempNUm=getTotalSize();
        if (tempNUm%sizeByPerPage==0){//余数为0说明除尽,
            return tempNUm/sizeByPerPage-1;
        }else {
            return tempNUm/sizeByPerPage;
        }
    }
    /**
     * 功能：根据真假的不同，得到不同表中的数据总条数
     * @return 返回数据总条数
     */
    private long getTotalSize(){
        return javaJpa.count();
    }
    /**
     * 功能：防止当前页面重复请求
     * @param page 当前页面将进行的动作
     * @return 返回查询到的结果
     */
    public List<Java> simplePage(String page){
        if (recordPage==null){//第一次进入
            recordPage = page;
            List=new ArrayList<>(getPage(page));
        }else if ("start".equals(recordPage)&&"start".equals(page)){
            if (isDel){//如果删除了，要获取一下新的，否则直接返回上一次的
                recordPage = page;
                List=new ArrayList<>(getPage(page));
                isDel=false;
            }
        }else if ("end".equals(recordPage)&&"end".equals(page)){
            if (isDel){//如果删除了，要获取一下新的，否则直接返回上一次的
                recordPage = page;
                List=new ArrayList<>(getPage(page));
                isDel=false;
            }
        }else {//前后翻页需要直接更新，但如果是首页和末尾则不用
            if ("down".equals(page)&&num==0){
                //第一页往前翻不操作
                return List;
            }else if ("up".equals(page)&&num==getTotalPage()){
                //最后一页往后翻不操作
                return List;
            }else {//中间页操作
                List=new ArrayList<>(getPage(page));
                recordPage = page;
            }
        }
        return List;
    }
    /**
     * 功能：下载图片,默认后缀.jpg,名字从1递增
     * @param urlList 存放图片url的List集合
     * @param savePath 保存图片的路径
     */
    public void downloadPic(List<String> urlList,String savePath) {
        URL url ;
        BufferedOutputStream bo=null;
        BufferedInputStream bi=null;
        int len;
        byte[] buffer = new byte[1024 * 10];
        try {
            for (String s : urlList) {
                url = new URL(s);
                File file = new File(savePath + (name++) + suffix);
                // 文件不存在
                if (!file.exists()) {
                    //bo生成时会创建一个文件，所以需放在里面
                    bi = new BufferedInputStream(url.openStream());
                    bo = new BufferedOutputStream(new FileOutputStream(file));
                    while ((len = bi.read(buffer)) != -1) {
                        bo.write(buffer, 0, len);
                        bo.flush();
                    }
                    System.out.println("下载：" + file.getPath() + "成功");
                } else {
                    System.out.println("该文件已存在" + file.getPath());
                }
                //每次都会创建一个新的对象，所以每次用完都需要关闭
                closeBiAndBo(bo,bi);
            }
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            closeBiAndBo(bo,bi);
        }
    }
    /**
     * 功能：关缓冲流
     */
    public void closeBiAndBo(BufferedOutputStream bo,BufferedInputStream bi){
        if (bo!=null){
            try {
                bo.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (bi!=null){
            try {
                bi.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 功能：得到存储工作时的时间
     * @return 时间 年月日时分秒
     */
    public String getJobTime(){
        Date date=new Date();
        return "本次工作信息收录时间为："+format.format(date);
    }
}
